
#!/user/bin/env python
# -*- coding: utf-8 -*-
''' 
Author: Sjy
LastEditTime: 2024-12-11 10:15:18
Description: 导入主模型
'''

__all__= []
import json
import numpy as np
import copy
from PyQt5 import QtCore, QtWidgets, QtGui

import gui.controls.envs as envs
from ..actions import Actions


global SHOW_DLG
SHOW_DLG = None

class DlgLowShowResult(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        global SHOW_DLG
        py3d = envs.GL.get_value('py3d')
        super().__init__(py3d)
        if SHOW_DLG!=None: return
        SHOW_DLG = self
        self.ui = _UI()
        self.ui.setupUi(self)
        # 重新启用信号
        self.ui.sigOnSave.connect(self.on_save)
        self.finished.connect(self.closeDialog)
        self.init()
        self.show() 

        

    def init(self):
        data =  {}
        # 主模型和主模型的参数计算文件
        # data['mainModel'] = data.get('mainModel', "")
        # data['mainModelCalFile'] = data.get('mainModelCalFile', "")
        self.ui._init(copy.deepcopy(data))
    def on_save(self, data:dict={}):
        self.close()
        Actions.save_data({
            # "mainModelCalFile": data.get("mainModelCalFile") or "",
            # "mainModel": data.get("mainModel") or "",
        })
        # 注意添加完了 需要更新tree 中对应位置的数据节点 用于显示
        Actions.update_tree("mainModel")

    def closeDialog(self):
        global SHOW_DLG
        SHOW_DLG = None
        self.deleteLater()

class _UI(QtWidgets.QWidget):
    sigOnSave = QtCore.pyqtSignal(dict)
    def __init__(self):
        super().__init__()
        self.parent = None
        self.__data = {}
    #自定义消息
    def setupUi(self, parent):
        # 纵向布局
        self.parent = parent
        self.parent.setWindowTitle("显示结果")

        layout = QtWidgets.QVBoxLayout(parent)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)


        config = self.__get_ui_layout_config()
        ui_widget = envs.UILayout.CustomLayoutWidget(config, parent=parent)
        ui_widget.setMinimumSize(1200, 800)
        layout.addWidget(ui_widget)

        
    def __get_ui_layout_config(self) -> json:

        self._ui_form = self.init_form()
        # formLayout = self._ui_form._get_layout()
        self._ui_plot = self.init_plot()
        self._init_plot_data()
        btnCancel = QtWidgets.QPushButton("关闭")
        btnCancel.clicked.connect(lambda:self.parent.close())
        btnCancel.setMinimumWidth(80)
        btnCancel.setObjectName("DlgToolBtn")


        btnLayout = QtWidgets.QHBoxLayout()
        btnLayout.addWidget(btnCancel) 
        btnLayout.setAlignment(QtCore.Qt.AlignCenter)

        btnLayoutWidget = QtWidgets.QWidget()
        btnLayoutWidget.setLayout(btnLayout)

        return {
            "styles":{
                "gridColumn":3, # 布局列数，每个cell 组件所有flex加起来不能大于此值
                "margin": [10, 10, 10, 10], # 布局的边距 缺省为 [10, 10, 10, 10]
                "spacing": 10, # 布局的间距 缺省为 10
            },
            "grid": [ 
                [ # 一条数据表示一行，行内每条数据对应一个cell 组件
                    { # 第一行第1个组件
                        "widget": self._ui_form, # 自定义组件，要实现组件规范要求的方法、信号和槽函数
                        "styles":{
                            "colSpan": 1,
                        },
                    },
                    { # 第一行第2个组件
                        "widget": self._ui_plot, # 自定义组件，要实现组件规范要求的方法、信号和槽函数
                        "styles":{
                            "colSpan": 2,
                        },
                    }
                ],
                [ 
                    { # 第二行第1个组件
                        "widget": btnLayoutWidget, # 自定义组件，要实现组件规范要求的方法、信号和槽函数
                        "styles":{
                            "colSpan": 3,
                        },
                    },
                ]
            ]
        }

    def _init(self, data:dict={}) -> None:
        self.__data = data
        # self.__ui._sets(data)

    def init_plot(self):
        plot_widget = envs.UIPlot.CustomPlot(title="迭代曲线")
        # 绘制数据
        # 设置标题和标签
        # plot_widget.set_title("运行迭代曲线")
        plot_widget.set_labels("迭代次数", "目标距离值")
        
        # 设置坐标轴范围
        return plot_widget
    
    def init_form(self):
        # layout = self._ui_form._get_layout()
        return envs.UIForm.UiCustomForm(self.__get_ui_form_config(), parent=self.parent)
    
    def _init_plot_data(self, data:list=[]):
        # data 是个二维组 以下为测试数据
        data = [
            [2,3,4,5,6,7,8,9,10], # x 
            [3,11,110,1100,11000,110000,1100000,11000000,110000000], # y
        ]
        # x = np.linspace(0, 10, 100)
        # y = np.sin(x)
        self._ui_plot.set_limits(x_min=min(data[0]), x_max=max(data[0]), y_min=min(data[1]), y_max=max(data[1]))
        self._ui_plot.plot(data[0], data[1], label="迭代曲线", color="blue")
        return data[0], data[1]

    def __get_ui_form_config(self) -> json:
        return {
            "items":[
                {
                    "type": "text",
                    "key":"mainModel",
                    "typeParams": { # 不同的类型所需要的参数不同，由typeParams来传递
                        "title": "极限应变/应力",
                    },
                    "styleParams":{ # 控制样式的参数
                        "margin": [0, 0, 0, 0],
                        "space": 10,
                        "labWidth": 100,
                        "minWidth": 200,
                    }
                },
                {
                    "type": "text",
                    "key":"mainModelCalFile",
                    "typeParams": { # 不同的类型所需要的参数不同，由typeParams来传递
                        "title": "反演载荷",
                    },
                    "styleParams":{ # 控制样式的参数
                        "margin": [0, 0, 0, 0],
                        "space": 10,
                        "labWidth": 100,
                        "minWidth": 200,
                    }
                },
                {
                    "type": "vtkFile",
                    "key":"mainModelCalFile",
                    "typeParams": { # 不同的类型所需要的参数不同，由typeParams来传递
                        "title": "反演结果云图",
                    },
                    "styleParams":{ # 控制样式的参数
                        "margin": [0, 0, 0, 0],
                        "space": 10,
                        "labWidth": 100,
                        "minWidth": 200,
                    }
                },
            ]
        }
    